package cathttp

/*
import (
	"errors"
	"io/ioutil"
	"path/filepath"

	library "./library"
)

// processLock 流程锁类
// ! 注:
// !	这是一个十分简单的锁处理
// !	在没有锁情况下Lock函数执行为返回,加锁情况下进行锁
// !	加锁SetLock函数执行后必须执行Clear对其解锁,且不能多协程同时加/解锁
type processLock struct {
	Setlock bool // 上锁标志
	count   uint
	lock    chan bool
}

// Lock 锁
func (lock *processLock) Lock() {
	// * 检测锁状态
	if lock.Setlock {
		// *上锁
		lock.count++
		lock.lock <- true
	}
}

// SetLock 上锁
func (lock *processLock) SetLock() {
	lock.Setlock = true
}

// Clear 解锁
func (lock *processLock) Clear() {
	// * 是否上锁
	if lock.Setlock {
		// * 解除锁状态
		lock.Setlock = false
		// * 清除已锁
		for ; lock.count > 0; lock.count-- {
			<-lock.lock
		}
	}
}

// newProcessLock 创建锁
func newProcessLock() *processLock {
	return &processLock{
		lock: make(chan bool),
	}
}

// CachingByte 缓存字节
type CachingByte struct {
	Data []byte // * 数据
	// ? 标志信息
	Sync bool        // * 同步标志位
	time int64       // * 过期时间
	lock processLock // * 锁
}

// Read 读文件
func (Byte *CachingByte) Read() []byte {
	Byte.lock.Lock()
	return Byte.Data
}

// Write 写文件
func (Byte *CachingByte) Write(Data []byte) {
	Byte.lock.SetLock()
	Byte.Data = Data
	Byte.Sync = true
	Byte.lock.Clear()
}

// Caching 缓存类
type Caching struct {
	Path string // * 文件路径
	Time int64  // * 默认超时
	// 内部变量
	fp          library.FileExtend
	cachingList map[string]*CachingByte // * 管理列表
}

// Init 初始化
func (Caching *Caching) Init(Path string, Time int64, Fp library.FileExtend) *Caching {
	Caching.Path = Path
	Caching.Time = Time
	Caching.fp = Fp
	Caching.cachingList = make(map[string]*CachingByte)
	return Caching
}

// Open 打开文件
func (Caching *Caching) Open(Name string) (*CachingByte, error) {
	// * 查询文件
	if file, ok := Caching.cachingList[Name]; ok {
		file.time = Caching.Time
		return file, nil
	}
	// * 验证文件路径
	if isPath(Caching.Path, Name) {
		return nil, errors.New("异常路径访问")
	}
	// * 打开文件
	err := Caching.fp.Open(Name)
	if err != nil {
		return nil, err
	}
	Caching.cachingList[Name] = &CachingByte{
		time: Caching.Time,
		lock: processLock{},
	}

	Caching.cachingList[Name].Data, _ = ioutil.ReadAll(file)
	return Caching.cachingList[Name], nil
}

// isPath 验证路径
func isPath(Path string, Name string) bool {
	// * 格式化输入
	Path = filepath.Clean(Path)
	// * 格式化路径
	path := filepath.Clean(Path + Name)
	// * 判定路径
	return len(path) > len(Path) && path[:len(Path)] == Path
}
*/
